/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Movilizacion;

import commonsbeans.*;
import entities.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import persistence.*;
import persistence.exceptions.IllegalOrphanException;
import persistence.exceptions.NonexistentEntityException;
import persistence.exceptions.PreexistingEntityException;
import persistence.exceptions.RollbackFailureException;

/**
 *
 * @author Felipe Duarte
 */
@ManagedBean
@ViewScoped
public class GestionarPuntosEmergencia implements Serializable {
    
    @ManagedProperty(value = "#{sessionBean}")
    private SessionBean sessionBean;
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;
    private BarrioJpaController barrioJpaController = null;
    private DireccionJpaController direccionJpaController = null;
    private List<DatoComplementario> datoComplementarioList = null;
    private DatoComplementarioJpaController datoComplementarioJpaController = null;
    private TipoPuntoEmergenciaJpaController tipoPuntoEmergenciaJpaController = null;
    private PuntoEmergenciaJpaController puntoEmergenciaJpaController = null;
    private PrefijoJpaController prefijoJpaController = null;
    private CiudadJpaController ciudadJpaController = null;
    public List<Barrio> listaBarrios = new ArrayList<Barrio>();
    public List<TipoPuntoEmergencia> listaTipoPuntoEmergencia = new ArrayList<TipoPuntoEmergencia>();
    public List<PuntoEmergencia> listaPuntosEmergencia = new ArrayList<PuntoEmergencia>();
    public PuntoEmergencia puntoEmergenciaSelected = new PuntoEmergencia();
    private List<Prefijo> prefijoList;
    private List<TipoVia> tipoViaList;
    String globeIcon = "";
    boolean habilitarmapa = false;
    String globeIconDisable = "";
    String direccionMostrada = "";
    public TipoVia tipoVia = new TipoVia();
    private Prefijo prefijoVacio = new Prefijo();
    private DatoComplementario complementarioVacio = new DatoComplementario();
    public PuntoEmergencia puntoEmergencia = new PuntoEmergencia();
    private boolean editar = false;
    
    public GestionarPuntosEmergencia() {
    }

    //Constructor
    @PostConstruct
    public void init() {
        if (sessionBean.getUsuarioActual() != null) {
            initControllers();
            cargarBarrios();
            cargarListasDireccion();
            cargarResumenPuntosEmergencia();
            cargarTipoPuntoEmergencia();
            puntoEmergencia.setIdDireccionPuntoEmergencia(new Direccion());
            habilitarmapa = true;
            globeIcon = "/resources/Globe2Disabled.png";
            complementarioVacio = datoComplementarioJpaController.findDatoComplementario(19);
            prefijoVacio = prefijoJpaController.findPrefijo(25);
            
            
            
        }
        
    }

    //<editor-fold defaultstate="collapsed" desc="Funcionalidades">
    private void cargarResumenPuntosEmergencia() {
        listaPuntosEmergencia = new ArrayList<PuntoEmergencia>();
        List<Barrio> listaBarrios = ciudadJpaController.findCiudad(sessionBean.getUsuarioActual().getCiudadIdCiudad().getIdCiudad()).getBarrioList();
        for (int i = 0; i < listaBarrios.size(); i++) {
            List<PuntoEmergencia> lista = new ArrayList<PuntoEmergencia>();
            
            lista = listaBarrios.get(i).getPuntoEmergenciaList();
            for (int j = 0; j < lista.size(); j++) {
                listaPuntosEmergencia.add(lista.get(j));
            }
        }
    }
    
    public void actualizarInformacion() {
        cargarBarrios();
        cargarResumenPuntosEmergencia();
    }

    /**
     * Metodo para cargar las listas asociadas a las direcciones
     *
     * @see ApplicationBean
     * @see Prefijo
     * @see DatoComplementario
     * @see TipoVia
     *
     */
    private void cargarListasDireccion() {
        prefijoList = applicationBean.getPrefijoList();
        tipoViaList = applicationBean.getTipoViaList();
        datoComplementarioList = applicationBean.getDatoComplementarioList();
    }

    /**
     * Metodo para cargar los barrios
     *
     */
    private void cargarBarrios() {
        listaBarrios = barrioJpaController.getBarrio_Habilitados_Ciudad(sessionBean.getUsuarioActual().getCiudadIdCiudad());
        
    }

    /**
     * Metodo para cargar los tipos de puntos de emergencia como CAI, Bomberos
     *
     * @see TipoPuntoEmergencia
     *
     */
    private void cargarTipoPuntoEmergencia() {
        listaTipoPuntoEmergencia = tipoPuntoEmergenciaJpaController.findTipoPuntoEmergenciaEntities();
    }
    
    private void guardarDireccionPunto() {
        puntoEmergencia.getIdDireccionPuntoEmergencia().setIdDireccion(direccionJpaController.getIdMax() + 1);
        
        try {
            direccionJpaController.create(puntoEmergencia.getIdDireccionPuntoEmergencia());
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void guardarPunto() {
        
        try {
            puntoEmergencia.setIdPuntoEmergencia(puntoEmergenciaJpaController.getIdMax() + 1);
            puntoEmergenciaJpaController.create(puntoEmergencia);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Metodo para crear los puntos de emergencia, se crea si la variable de
     * editar es false, es decir no hay seleccionado ningun punto de emergencia
     *
     * @see PuntoEmergenciaJpaController
     * @see PuntoEmergencia
     *
     */
    public void guardarPuntoEmergencia() {
        
        if (!editar) {
            if (puntoEmergencia.getLatitudPuntoEmergencia() == null) {
                applicationBean.showErrorMessage("Debe ubicar el punto de emergencia en el mapa");
            } else {
                guardarDireccionPunto();
                guardarPunto();
                showSuccessMessage("se ha registrado la construcción de manera éxitosa");
                listaPuntosEmergencia.add(puntoEmergencia);
                cargarResumenPuntosEmergencia();
                limpiarCampos();
            }
        } else {
            editarDireccionPunto();
            editarPuntoEmergencia();
            cargarResumenPuntosEmergencia();
            limpiarCampos();
        }
        
    }
    
    private void editarDireccionPunto() {
        try {
            direccionJpaController.edit(puntoEmergencia.getIdDireccionPuntoEmergencia());
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void editarPuntoEmergencia() {
        try {
            puntoEmergenciaJpaController.edit(puntoEmergencia);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarPuntosEmergencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public void rowSelected() {
        
        puntoEmergencia = puntoEmergenciaSelected;
        revisarDireccion();
        editar = true;
    }
    
    public void onRow() {
        puntoEmergenciaSelected = new PuntoEmergencia();
        puntoEmergencia = new PuntoEmergencia();
        editar = false;
    }

    /**
     * Metodo para revisar la direccion y asignar la direccion construida para
     * el geo referenciador
     *
     */
    public void revisarDireccion() {
        String ciudad = sessionBean.getUsuarioActual().getCiudadIdCiudad().getNombreCiudad() + " " + sessionBean.getUsuarioActual().getCiudadIdCiudad().getIdDepartamentoCiudad().getNombreDepartamento();
        Direccion d = new Direccion();
        int i = 0;
        d = puntoEmergencia.getIdDireccionPuntoEmergencia();
        if (d.getIdPrefijo1() == null) {
            
            d.setIdPrefijo1(prefijoVacio);
        }
        if (d.getDatoComplementario() == null) {
            
            d.setDatoComplementario(complementarioVacio);
        }
        if (d.getIdPrefijo2() == null) {
            d.setIdPrefijo2(prefijoVacio);
        }
        if (d.getIdPrefijo3() == null) {
            d.setIdPrefijo3(prefijoVacio);
        }
        if (d.getIdPrefijo4() == null) {
            d.setIdPrefijo4(prefijoVacio);
        }
        if (d.getTipoViaIdTipoVia() == null) {
            d.setTipoViaIdTipoVia(new TipoVia());
            i = 1;
        }
        if (d.getNombreViaDireccion() == null || d.getNumeroViaDireccion() == null || d.getNumeroPlacaDireccion() == null) {
            i = 1;
        }
        if (i == 0) {
            direccionMostrada = d.getTipoViaIdTipoVia().getNombreTipoVia() + " " + d.getNombreViaDireccion() + " " + d.getIdPrefijo1().getNombrePrefijo() + " "
                    + d.getIdPrefijo2().getNombrePrefijo() + " " + d.getNumeroViaDireccion() + " " + d.getIdPrefijo3().getNombrePrefijo() + " "
                    + d.getIdPrefijo4().getNombrePrefijo() + " " + d.getNumeroPlacaDireccion() + " " + ciudad;
            
            
            globeIcon = "/resources/Globe2.png";
            habilitarmapa = false;
        } else {
            globeIcon = "/resources/Globe2Disabled.png";
            habilitarmapa = true;
        }
        
    }
    
    public void showSuccessMessage(String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Operación exitosa", detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    /**
     * Metodo para limpiar el formulario
     *
     */
    private void limpiarCampos() {
        puntoEmergencia = new PuntoEmergencia();
        puntoEmergenciaSelected = new PuntoEmergencia();
        direccionMostrada = "";
        habilitarmapa = true;
        globeIcon = "/resources/Globe2Disabled.png";
    }
//</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Getter's y setter's">
    public List<Barrio> getListaBarrios() {
        return listaBarrios;
    }
    
    public void setListaBarrios(List<Barrio> listaBarrios) {
        this.listaBarrios = listaBarrios;
    }
    
    public List<PuntoEmergencia> getListaPuntosEmergencia() {
        return listaPuntosEmergencia;
    }
    
    public void setListaPuntosEmergencia(List<PuntoEmergencia> listaPuntosEmergencia) {
        this.listaPuntosEmergencia = listaPuntosEmergencia;
    }
    
    public PuntoEmergencia getPuntoEmergencia() {
        return puntoEmergencia;
    }
    
    public void setPuntoEmergencia(PuntoEmergencia puntoEmergencia) {
        this.puntoEmergencia = puntoEmergencia;
    }
    
    public TipoVia getTipoVia() {
        return tipoVia;
    }
    
    public void setTipoVia(TipoVia tipoVia) {
        this.tipoVia = tipoVia;
    }
    
    public boolean isHabilitarmapa() {
        return habilitarmapa;
    }
    
    public PuntoEmergencia getPuntoEmergenciaSelected() {
        return puntoEmergenciaSelected;
    }
    
    public void setPuntoEmergenciaSelected(PuntoEmergencia puntoEmergenciaSelected) {
        this.puntoEmergenciaSelected = puntoEmergenciaSelected;
    }
    
    public void setHabilitarmapa(boolean habilitarmapa) {
        this.habilitarmapa = habilitarmapa;
    }
    
    public SessionBean getSessionBean() {
        return sessionBean;
    }
    
    public String getDireccionMostrada() {
        return direccionMostrada;
    }
    
    public void setDireccionMostrada(String direccionMostrada) {
        this.direccionMostrada = direccionMostrada;
    }
    
    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }
    
    public ApplicationBean getApplicationBean() {
        return applicationBean;
    }
    
    public void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }
    
    public String getGlobeIcon() {
        return globeIcon;
    }
    
    public void setGlobeIcon(String globeIcon) {
        this.globeIcon = globeIcon;
    }
    
    public List<TipoVia> getTipoViaList() {
        return tipoViaList;
    }
    
    public void setTipoViaList(List<TipoVia> tipoViaList) {
        this.tipoViaList = tipoViaList;
    }
    
    public List<DatoComplementario> getDatoComplementarioList() {
        return datoComplementarioList;
    }
    
    public void setDatoComplementarioList(List<DatoComplementario> datoComplementarioList) {
        this.datoComplementarioList = datoComplementarioList;
    }
    
    public List<Prefijo> getPrefijoList() {
        return prefijoList;
        
    }
    
    public List<TipoPuntoEmergencia> getListaTipoPuntoEmergencia() {
        return listaTipoPuntoEmergencia;
    }
    
    public void setListaTipoPuntoEmergencia(List<TipoPuntoEmergencia> listaTipoPuntoEmergencia) {
        this.listaTipoPuntoEmergencia = listaTipoPuntoEmergencia;
    }
    
    public void setPrefijoList(List<Prefijo> prefijoList) {
        this.prefijoList = prefijoList;
    }
    
    public String getGlobeIconDisable() {
        return globeIconDisable;
    }
    
    public void setGlobeIconDisable(String globeIconDisable) {
        this.globeIconDisable = globeIconDisable;
    }
//</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Inicializar los controladores">
    public void initControllers() {
        FacesContext context = FacesContext.getCurrentInstance();
        barrioJpaController = (BarrioJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "barrioJpaController");
        direccionJpaController = (DireccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "direccionJpaController");
        prefijoJpaController = (PrefijoJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "prefijoJpaController");
        datoComplementarioJpaController = (DatoComplementarioJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "datoComplementarioJpaController");
        tipoPuntoEmergenciaJpaController = (TipoPuntoEmergenciaJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "tipoPuntoEmergenciaJpaController");
        puntoEmergenciaJpaController = (PuntoEmergenciaJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "puntoEmergenciaJpaController");
        ciudadJpaController = (CiudadJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "ciudadJpaController");
    }
//</editor-fold>
}
